Commonjs 的模块加载机制,Commonjs 模块加载机制如下:使用:使用 require 加载模块, 使用 module.exports 向外部暴露模块特定: 模块同时加载,这种特点在 node 环境下是不存在问题的, 因为 node 环境下模块都是在本地磁盘,加载比较快, 但是在浏览器环境下时会出现阻塞渲染的问题为了解决异步加载模块的问题,AMD(https://github.com/amdjs/amdjs-api/wiki) 和 CMD 通过不同的方式实现异步加载模块:AMD : 相关库: requireJs写法:1 | define("module", ["dep1", "dep2"], function(d1, d2) { |
seaJs1 | define(function(require, exports, module) { |
AMD 和 CMD 两个规范之外,使用es6 的模块加载是浏览器的另一种模块加载机制,也是未来的主流使用 es6 模块加载实现动态加载的方法: import(module)1 | // 导入 dayJs 模块 |
browserify 是如何实现的适配各种模块加载的呢 ?具体代码如下:按照 virtual-dom 这个包为例:这个包的作用是生成虚拟dom对象执行 package.json 中的命令:1 | "dist": "browserify virtual-dom index.js > dist/virtual-dom.js", |
browserify 来处理, 最终打包完成后的文件输出到 dist/virtual-dom.js 中, 在打包后的代码中,我们可以看到如下的代码结构:处理之后的代码中:将原来文件中 require(...) 这样的文件引用替换为具体的执行函数1 | // 自执行方法 f 为下面的 函数1 |